﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

using Microsoft.AspNetCore.Mvc.Filters;
using Neto.Web.Listeners;

namespace Neto.Core.NetoCore.Listener;

public class WebAccessLogListener : IWebAccessLogListener
{
    public async Task Log(ActionExecutingContext context, ActionExecutedContext resultContext, WebHttpInfo webHttpInfo,
        long elapsedTime, string log)
    {
        // var logAccess = new SysLogAccess();
        // logAccess.RemoteAddr= webHttpInfo.Connection.RemoteIpAddress;
        // logAccess.RequestUrl = webHttpInfo.Request.Path;
        // logAccess.Method = webHttpInfo.Request.Method;
        // logAccess.UrlParams = webHttpInfo.Request.QueryString;
        // logAccess.Params = webHttpInfo.Request.RouteValues;
        // logAccess.Header = webHttpInfo.Request.Headers;
        // logAccess.Area= webHttpInfo.RequestEx.AreaName;
        // logAccess.Controller = webHttpInfo.RequestEx.ControllerName;
        // logAccess.Action = webHttpInfo.RequestEx.ActionName;
        // logAccess.Os = webHttpInfo.RequestEx.Os;
        // logAccess.Browser = webHttpInfo.RequestEx.Browser;
        // logAccess.Device = webHttpInfo.RequestEx.Device;
        // logAccess.Exception = resultContext?.Exception?.ToString();
        // logAccess.LogContent = log;
        // logAccess.Tag=$"{webHttpInfo.RequestEx.LocalIPv4},{webHttpInfo.RequestEx.Os},{webHttpInfo.RequestEx.Browser},{webHttpInfo.RequestEx.RequestUrl}";
        // logAccess.Type = "";
        //
        // //写入日志
        // var tableName = SqlSugarHelper.Db.SplitHelper<SysLog>().GetTableName(DateTime.Now);
        // await SqlSugarHelper.Db.Insertable(logAccess).SplitTable().ExecuteReturnSnowflakeIdAsync();
        
        var info = context.HttpContext.GetWebInfo();
        
        var entity = info.Adapt<SysLog>();
        entity.ElapsedTime = elapsedTime;
        entity.Tag =
            $"{info.RequestEx.LocalIPv4},{info.RequestEx.Os},{info.RequestEx.Browser},{info.RequestEx.RequestUrl}";
        entity.LogType = LogType.Action;
        entity.WebInfo = info;
        entity.WebFingerprint = info.GenerateUserFingerprint();
        entity.IsSuccess = resultContext?.Exception == null;
        entity.Message = resultContext?.Exception?.Message;
        entity.LogContent =log;
        entity.Result=resultContext?.Result?.ToJson();
        entity.Exception = resultContext?.Exception?.ToStringEx();
        entity.Tag=$"{webHttpInfo.RequestEx.LocalIPv4},{webHttpInfo.RequestEx.Os},{webHttpInfo.RequestEx.Browser},{webHttpInfo.RequestEx.RequestUrl}";
        entity.WebInfo = webHttpInfo;
        entity.WebFingerprint = webHttpInfo.GenerateUserFingerprint();
        entity.Ip=webHttpInfo.RequestEx.RemoteIPv4;
        entity.RequestUrl=webHttpInfo.Request.Path;
        entity.UserId=AppX.UserId;
        
        
        //写入日志
        var tableName = SqlSugarHelper.Db.SplitHelper<SysLog>().GetTableName(DateTime.Now);
        await SqlSugarHelper.Db.Insertable(entity).SplitTable().ExecuteReturnSnowflakeIdAsync();
    }
}